package com.blog.cmrpersonalblog.dto.ranking.respnose;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 榜单项响应DTO（通用）
 * 使用 @JsonInclude 注解，只返回非 null 的字段，避免前端收到无效数据
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RankingItemResponse {
    
    /**
     * 排名
     */
    private Integer rank;
    
    /**
     * 目标ID（文章ID或作者ID）
     */
    private Long targetId;
    
    /**
     * 热度分数（整数）
     */
    private Long heatScore;
    
    /**
     * 标题（文章标题或作者昵称）
     */
    private String title;
    
    /**
     * 副标题（作者昵称或作者签名）
     */
    private String subtitle;
    
    /**
     * 封面图片URL
     */
    private String coverImage;
    
    /**
     * 头像URL（作者榜使用）
     */
    private String avatar;
    
    /**
     * 浏览量
     */
    private Integer viewCount;
    
    /**
     * 点赞数
     */
    private Integer likeCount;
    
    /**
     * 收藏数
     */
    private Integer collectCount;
    
    /**
     * 评论数
     */
    private Integer commentCount;
    
    /**
     * 分享数
     */
    private Integer shareCount;
    
    /**
     * 粉丝数（作者榜使用）
     */
    private Integer fansCount;
    
    /**
     * 文章数（作者榜使用）
     */
    private Integer articleCount;
    
    /**
     * 发布时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime publishTime;
    
    /**
     * 分类ID
     */
    private Long categoryId;
    
    /**
     * 分类名称
     */
    private String categoryName;
    
    /**
     * 作者ID
     */
    private Long authorId;
    
    /**
     * 作者昵称
     */
    private String authorNickName;
    
    /**
     * 作者头像
     */
    private String authorAvatar;
    
    /**
     * 排名变化（相比上次）
     * 正数表示上升，负数表示下降，0表示不变，null表示新上榜
     */
    private Integer rankChange;
    
    /**
     * 是否新上榜
     */
    private Boolean isNew;

    /**
     * 当前用户是否收藏了该文章（文章榜使用，未登录时为 null）
     */
    private Boolean isCollected;

    /**
     * 当前用户是否关注了该作者（作者榜使用，未登录时为 null）
     */
    private Boolean isFollowed;
}

